// 给定一个无重复元素的有序整数数组 nums 。

// 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表。
// 也就是说，nums 的每个元素都恰好被某个区间范围所覆盖，并且不存在属于某个范围但不属于 nums 的数字 x 。
// 列表中的每个区间范围 [a,b] 应该按如下格式输出：

// "a->b" ，如果 a != b
// "a" ，如果 a == b
// 其中：
// nums 中的所有值都 互不相同
// nums 按升序排列

// 直观解法
const summaryRanges2 = function (nums: number[]): string[] {
    // 安全检测
    if (nums.length < 1) return [];
    const res: string[] = [];
    let preStart: number = nums[0];
    let add: number = 1;
    for (let i = 1; i < nums.length; i++) {
        if (nums[i] === preStart + add) {
            add++;
        } else {
            const pushValue = add === 1 ?
                preStart.toString() :
                preStart.toString() + '->' + (preStart + add - 1).toString();
            res.push(pushValue);
            // 重置状态
            add = 1;
            preStart = nums[i]
        }
    }
    // 边界处理
    res.push(add === 1 ? preStart.toString() : preStart.toString() + '->' + (preStart + add - 1).toString());
    return res;
};


// 双指针解法
const summaryRanges = function (nums: number[]): string[] {
    let left: number = 0;
    let right: number = left + 1; // // 代表选取的区间，左闭右开
    const res: string[] = [];
    while (right <= nums.length) {
        if (nums[right] === nums[right - 1] + 1) {
            right++
        } else {
            const pushValue: string = right === left + 1 ?
                String(nums[left]) :
                String(nums[left]) + '->' + String(nums[right - 1]);
            res.push(pushValue);
            // 状态重置
            left = right;
            right++;
        }
    }
    return res;
};

summaryRanges(
    [0, 1, 2, 4, 5, 7]);



// 比较简单的一道题目，如果按照直觉解法的话需要注意细节：
// 1. 数组访问是否越界需要主要
// 2. 最后一个元素是否忘记添加进结果数组

// 此外这道题目还可以使用双指针的解法，双指针的解法会更优雅一些
// 左指针代表起点元素（为闭），右指针代表终点元素+1（为开）
// 然后不断地滑动右指针，调整左指针地方式来加入区间，这种左闭右开的区间汇总方式
// 可以避免了边缘情况的特殊处理